package mylist;

import java.util.Arrays;

public class MyArrayList implements IList {
    public int[] elem;
    public int usedsize;
    public static final int DEFAULT_SIZE=10;

    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];
    }
    public MyArrayList(int size){
        this.elem = new int[size];
    }

    @Override
    public void add(int data) {
       chackCcpacity();
            elem[usedsize] = data;
            usedsize++;
    }
    @Override
    public  boolean isFull(){
        if(usedsize==elem.length)
            return true;
        else return false;
    }
    public void chackCcpacity(){
        if(isFull())
            //扩容
            elem= Arrays.copyOf(elem,elem.length*2);
    }

    @Override
    public void add(int pos, int data) {
        try {
           chacklegal(pos);
       }catch (PosILegal e){
           e.printStackTrace();
           return;
       }
        chackCcpacity();
        for(int i=usedsize-1;i>=pos;i--){
            elem[i+1]=elem[i];
        }
         elem[pos]=data;
        usedsize++;
    }

    private  void chacklegal(int pos)throws RuntimeException{
        if(pos<0||pos>usedsize) {
            System.out.println(pos+" 位置不合法");
            throw new PosILegal("插入元素下标异常"+pos);
        }
    }

    @Override
    public boolean contains(int toFind) {
        //判断是否为空
        if(empty())
            return false;
        for(int i=0;i<usedsize;i++){
            if(elem[i]==toFind)//如果不是基本类型，是引用类型要重写equals方法
            return true;
        }
        return false;
    }

    public boolean empty(){
        if(this.usedsize==0)
            return true;
        else return false;
    }



    @Override
    public int indexof(int toFind) {
        //如果数组为空
        if(empty()){
            return  -1;
        }
        for (int i=0;i<usedsize;i++) {
            if (elem[i] == toFind)
                return i;
        }
        return -1;
    }

    private  void chackgetsetlegal(int pos)throws RuntimeException{
        if(pos<0||pos>=usedsize) {
            System.out.println(pos+" 位置不合法");
            throw new PosILegal("获取指定元素下标异常"+pos);
        }
    }

    private void chackGetLegal (int usedsize)throws RuntimeException{
        if(empty()){
            System.out.println("无可取元素");
            throw new GetLegal("获取pos位置元素异常，请重试");

        }
    }

    @Override
    public int get(int pos) throws RuntimeException {
        chackgetsetlegal(pos);
       chackGetLegal(usedsize);
        return elem[pos];
    }

    @Override
    public void set(int pos, int value) {
        chackgetsetlegal(pos);
        elem[pos]=value;
    }

    @Override
    public void remove(int toRemove) {
//        if(empty()){
//            System.out.println("无可删元素");
//        }
        //上面写法缺乏考虑，只考虑了为空的情况，没考虑如果没有找到这个toRemove呢？
        int ret=indexof(toRemove);//要学以致用，自己刚刚写的代码就可以用了
        if(ret==-1){
            System.out.println("所找元素不存在");
            return;
        }
        else  {
            for (int i = ret; i < usedsize-1; i++) {//注意越界的情况
                if (elem[i] == toRemove) {
                    elem[i + 1] = elem[i];
                }
            }
        }
        usedsize--;
    }

    @Override
    public int size() {
        return this.usedsize;
    }

    @Override
    public void clear() {
        this.usedsize=0;
    }

    @Override
    public void display() {
        for(int i=0;i<this.usedsize;i++){
            System.out.println(this.elem[i]+" ");
        }
        System.out.println();//仅换行
    }
}

//补充：想表示非常大的数据可以用String str="...";














